﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using DAL.Entity;


namespace DAL.Persistencia
{
    public class PeriodosDAL
    {
        private NewTierraEntities Con;

        public PeriodosDAL()
        {
            Con = new NewTierraEntities();
        }

        public void Salvar(S_Mercado_Periodo c)
        {
            try
            {
                //Provedor de Conexão do EntityFramework
                //NewTierraEntities Con = new NewTierraEntities();

                //Rotinas prontas para o banco de dados
                Con.AddToS_Mercado_Periodo(c); //insert into S_Mercado_Periodo values...
                Con.SaveChanges(); //Executar a operação

            }
            catch
            {
                throw;
            }
        }

        public void Excluir(S_Mercado_Periodo c)
        {
            try
            {
                Con.DeleteObject(c); //Prepara a deleção
                Con.SaveChanges(); //Executa a transação (commit)
            }
            catch
            {
                throw;
            }
        }

        public int GetPeriodsCount()
        {
            return Con.S_Mercado_Periodo.Count();
        }

        public List<S_Mercado_Periodo> ListarTodos()
        {
            try
            {
                //SQL -> select * from S_Mercado_Periodo_Black
                return Con.S_Mercado_Periodo.ToList();
            }
            catch
            {
                throw;
            }
        }

        public object ListarTodos(Int32 SupplierID)
        {
            try
            {
                //SQL -> select * from S_Mercado_Periodo
                //return Con.S_Mercado_Periodo.ToList();

                var query = from p in Con.S_Mercado_Periodo
                            join c in Con.S_Mercado_Estacao on p.S_mercado_estacao_id equals c.S_mercado_estacao_id
                            join m in Con.Mercadoes on p.Mercado_id equals m.Mercado_id
                            where p.S_id == SupplierID
                            orderby p.S_merc_periodo_from descending
                            select new
                            {
                                p.S_merc_periodo_id,
                                p.S_merc_periodo_from,
                                p.S_merc_periodo_to,
                                p.S_id,
                                c.S_mercado_estacao_nome,
                                m.Mercado_nome
                            };

                return query.ToList();
            }
            catch
            {
                throw;
            }
        }

        public object ListarTodos(Int32 SupplierID, Int32 MercadoID, Int32 BaseTarifariaID)
        {
            try
            {
                //SQL -> select * from S_Mercado_Periodo
                //return Con.S_Mercado_Periodo.ToList();

                var query = from p in Con.S_Mercado_Periodo
                            join c in Con.S_Mercado_Estacao on p.S_mercado_estacao_id equals c.S_mercado_estacao_id
                            join mpf in Con.S_Mercado_Periodo_Fds on p.S_merc_periodo_id equals mpf.S_merc_periodo_id into joinDeptEmp
                            from m in joinDeptEmp.DefaultIfEmpty()
                            where p.S_id == SupplierID && p.Mercado_id == MercadoID && p.BaseTarifaria_id == BaseTarifariaID
                            orderby p.S_merc_periodo_from descending
                            select new
                            {
                                p.S_merc_periodo_id,
                                p.S_merc_periodo_from,
                                p.S_merc_periodo_to,
                                p.Pacote_nome,
                                c.S_mercado_estacao_nome,
                                m.S_mercado_per_fds_from,
                                m.S_mercado_per_fds_to,
                                p.S_id
                            };

                return query.ToList();
            }
            catch
            {
                throw;
            }
        }

        public object ListarTodosOrdenado(Int32 SupplierID, Int32 MercadoID, Int32 BaseTarifariaID, string Ordem)
        {
            try
            {
                //SQL -> select * from S_Mercado_Periodo
                //return Con.S_Mercado_Periodo.ToList();

                var query = from p in Con.S_Mercado_Periodo
                            join c in Con.S_Mercado_Estacao on p.S_mercado_estacao_id equals c.S_mercado_estacao_id
                            join mpf in Con.S_Mercado_Periodo_Fds on p.S_merc_periodo_id equals mpf.S_merc_periodo_id into joinDeptEmp
                            from m in joinDeptEmp.DefaultIfEmpty()
                            where p.S_id == SupplierID && p.Mercado_id == MercadoID && p.BaseTarifaria_id == BaseTarifariaID
                            orderby p.S_merc_periodo_from descending
                            select new
                            {
                                p.S_merc_periodo_id,
                                p.S_merc_periodo_from,
                                p.S_merc_periodo_to,
                                c.S_mercado_estacao_nome,
                                m.S_mercado_per_fds_from,
                                m.S_mercado_per_fds_to,
                                p.S_id
                            };

                var query2 = from p in Con.S_Mercado_Periodo
                            join c in Con.S_Mercado_Estacao on p.S_mercado_estacao_id equals c.S_mercado_estacao_id
                            join mpf in Con.S_Mercado_Periodo_Fds on p.S_merc_periodo_id equals mpf.S_merc_periodo_id into joinDeptEmp
                            from m in joinDeptEmp.DefaultIfEmpty()
                            where p.S_id == SupplierID && p.Mercado_id == MercadoID && p.BaseTarifaria_id == BaseTarifariaID
                            orderby p.S_merc_periodo_from ascending
                            select new
                            {
                                p.S_merc_periodo_id,
                                p.S_merc_periodo_from,
                                p.S_merc_periodo_to,
                                c.S_mercado_estacao_nome,
                                m.S_mercado_per_fds_from,
                                m.S_mercado_per_fds_to,
                                p.S_id
                            };

                if (Ordem.Equals("ASC"))
                { return query2.ToList(); }
                else
                { return query.ToList(); }
                
            }
            catch
            {
                throw;
            }
        }

        public S_Mercado_Periodo ObterPorId(int IdMercadoPeriodo)
        {
            try
            {
                //select * from TbCliente where IdCliente = ?
                return Con.S_Mercado_Periodo.Where(c => c.S_mercado_estacao_id == IdMercadoPeriodo).Single();

                //Single -> Retorna apenas 1 Registro e dá erro para qualquer
                //          resultado diferente de 1 Registro.
            }
            catch
            {
                throw;
            }
        }

        public S_Mercado_Periodo ObterPorIdMercado(int IdMercadoPeriodo)
        {
            try
            {
                //select * from TbCliente where IdCliente = ?
                return Con.S_Mercado_Periodo.Where(c => c.S_merc_periodo_id == IdMercadoPeriodo).Single();

                //Single -> Retorna apenas 1 Registro e dá erro para qualquer
                //          resultado diferente de 1 Registro.
            }
            catch
            {
                throw;
            }
        }

        public Int32 VerificaTarifa(string from, string to, int Sid)
        {
            try
            {
                //select * from TbProduto where Nome like ?
                //int cons1 = Con.S_Mercado_Periodo.Where(p => p.S_merc_periodo_from.Equals(from) || p.S_merc_periodo_to.Equals(to) || p.S_id.Equals(Sid)).Count();

                Int32 cons1 = Con.S_Mercado_Periodo.Where(p => p.S_id.Equals(Sid)).Count();
                Int32 cons2 = Con.S_Mercado_Periodo.Where(p => p.S_merc_periodo_from.Equals(from)).Count();

                
                if (cons1 > 0)
                {
                   
                }
                 return cons1;

                //Expressões LAMBDA
                /*
                 * StartsWith   -> Começa com
                 * EndsWith     -> Termina com
                 * Contains     -> Contendo
                 * Equals       -> Exatamente igual
                 */
            }
            catch
            {
                throw; //Lançar a exceção adiante...
            }
        }

        public void Atualizar(S_Mercado_Periodo registroNovo)
        {
            try
            {
                //Buscar na base de dados o Registro antigo
                S_Mercado_Periodo registroAntigo = ObterPorIdMercado(registroNovo.S_merc_periodo_id);

                //Atualizando os dados
                registroAntigo.S_merc_periodo_from  = registroNovo.S_merc_periodo_from;
                registroAntigo.S_merc_periodo_to    = registroNovo.S_merc_periodo_to;
                registroAntigo.Pacote_nome          = registroNovo.Pacote_nome;
                registroAntigo.S_id                 = registroNovo.S_id;
                registroAntigo.S_mercado_estacao_id = registroNovo.S_mercado_estacao_id;
                registroAntigo.Mercado_id           = registroNovo.Mercado_id;
                registroAntigo.Moeda_id             = registroNovo.Moeda_id;
                registroAntigo.MinimoNoites_id      = registroNovo.MinimoNoites_id;
                registroAntigo.Promocao_id          = registroNovo.Promocao_id;

                //Executo a transação
                Con.SaveChanges();
            }
            catch
            {
                throw;
            }
        }
    }
}
